@file:JvmName("OtherFunction")

package dsl

/**
 * 空值转换函数，前面的表达式为空时选择后面的表达式
 * @param query Query 检测表达式
 * @param value Query 为空时使用的表达式
 * @return Query 表达式类型
 */
fun ifNull(query: Query, value: Query): Query {
    return QueryExprFunction("*IFNULL", listOf(query, value))
}

/**
 * 空值转换函数，前面的表达式为空时选择后面的表达式
 * @param query Query 检测表达式
 * @param value T 为空时使用的值，合法的类型有Number、String、Date、List、Boolean以及null
 * @return Query 表达式类型
 */
fun <T> ifNull(query: Query, value: T): Query {
    return ifNull(query, const(value))
}

/**
 * 类型转换函数
 * @param query Query 待转换表达式
 * @param type String 转换的类型
 * @return Query 表达式类型
 */
fun cast(query: Query, type: String): Query {
    return QueryCast(query, type)
}

/**
 * 字符串聚合函数
 * @param query Query 聚合的列
 * @param separator String 分隔符
 * @param distinct Boolean 是否去重
 * @param orderBy Array<out OrderBy> 排序规则
 * @return Query 表达式类型
 */
fun stringAgg(
    query: Query,
    separator: String,
    distinct: Boolean = false,
    vararg orderBy: OrderBy
): Query {
    return QueryAggFunction("*STRING_AGG", listOf(query, const(separator)), distinct = distinct, orderBy = orderBy.toList())
}

/**
 * 数组聚合函数
 * @param query Query 聚合的列
 * @param separator String 分隔符
 * @param distinct Boolean 是否去重
 * @param orderBy Array<out OrderBy> 排序规则
 * @return Query
 */
fun arrayAgg(
    query: Query,
    separator: String,
    distinct: Boolean = false,
    vararg orderBy: OrderBy
): Query {
    return QueryAggFunction("*ARRAY_AGG", listOf(query, const(separator)), distinct = distinct, orderBy = orderBy.toList())
}

/**
 * 查找字符否在某个以","隔开的字符串中
 * @param value Query 查找的字符
 * @param query Query 查找的列
 * @return Query 表达式类型
 */
fun findInSet(value: Query, query: Query): Query {
    return QueryExprFunction("*FIND_IN_SET", listOf(value, query))
}

/**
 * 查找字符否在某个以","隔开的字符串中
 * @param value String 查找的字符
 * @param query Query 查找的列
 * @return Query 表达式类型
 */
fun findInSet(value: String, query: Query): Query {
    return findInSet(const(value), query)
}

/**
 * jsonLength函数
 * @param query Query 查找的表达式
 * @return Query 表达式类型
 */
fun jsonLength(query: Query): Query {
    return QueryExprFunction("*JSON_LENGTH", listOf(query))
}

/**
 * 拼接函数
 * @param query Array<out Query> 拼接的表达式列表
 * @return Query 表达式类型
 */
fun concat(vararg query: Query): Query {
    return QueryExprFunction("*CONCAT", query.toList())
}

/**
 * 拼接函数
 * @param separator String 分隔符
 * @param query Array<out Query> 拼接的表达式列表
 * @return Query 表达式类型
 */
fun concatWs(separator: String, vararg query: Query): Query {
    listOf<Query>(const(separator)) + query.toList()
    return QueryExprFunction("*CONCAT_WS", listOf<Query>(const(separator)) + query.toList())
}